环境搭建完成后,让我们来编写第一个 Go 程序——经典的 "Hello World"。通过这个简单的程序,你将了解 Go 程序的基本结构。
首先,创建一个存放代码的目录:
Windows:
mkdir %USERPROFILE%\go\src\hello
cd %USERPROFILE%\go\src\hello
macOS/Linux:
mkdir -p ~/go/src/hello
cd ~/go/src/hello
Go 1.11 引入了模块(Module)管理,我们使用 go mod init 初始化:
go mod init hello
这会创建一个 go.mod 文件,用于管理依赖:
module hello
go 1.22
在项目目录下创建 main.go 文件,输入以下代码:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
让我们逐行分析这段代码:
第 1 行:package main
package main
package 关键字用于声明包名main 是一个特殊的包名,表示这是一个可执行程序第 3 行:import "fmt"
import "fmt"
import 关键字用于导入其他包fmt 是 Go 标准库中的格式化输入输出包fmt.Println 用于打印输出第 5 行:func main()
func main() {
// 函数体
}
func 关键字用于定义函数main 是一个特殊的函数名,是程序的入口点main 函数开始执行第 6 行:fmt.Println("Hello, World!")
fmt.Println("Hello, World!")
fmt 包的 Println 函数Println 会自动在末尾添加换行符┌─────────────────────────────────────┐
│ package main │ ← 包声明
├─────────────────────────────────────┤
│ import "fmt" │ ← 导入包
├─────────────────────────────────────┤
│ func main() { │ ← 主函数
│ fmt.Println("Hello, World!") │ ← 函数体
│ } │
└─────────────────────────────────────┘
go run 命令用于编译并运行 Go 程序:
go run main.go
输出:
Hello, World!
go run 的工作流程:
源代码 → 编译 → 临时可执行文件 → 运行 → 输出结果
go build 命令用于编译程序,生成可执行文件:
go build
这会在当前目录生成一个可执行文件:
hello.exehello然后运行这个可执行文件:
Windows:
.\hello.exe
macOS/Linux:
./hello
输出:
Hello, World!
| 命令 | 说明 | 适用场景 |
|---|---|---|
go run | 编译并运行,不保留可执行文件 | 开发调试 |
go build | 编译生成可执行文件 | 发布部署 |
fmt.Print 输出不换行:
package main
import "fmt"
func main() {
fmt.Print("Hello, ")
fmt.Print("World!")
}
输出:
Hello, World!
fmt.Println 输出后自动换行:
package main
import "fmt"
func main() {
fmt.Println("Hello")
fmt.Println("World")
}
输出:
Hello
World
fmt.Printf 支持格式化输出:
package main
import "fmt"
func main() {
name := "张三"
age := 25
fmt.Printf("姓名: %s, 年龄: %d\n", name, age)
}
输出:
姓名: 张三, 年龄: 25
常用格式化动词:
| 动词 | 说明 | 示例 |
|---|---|---|
%s | 字符串 | "hello" |
%d | 整数 | 123 |
%f | 浮点数 | 3.14 |
%t | 布尔值 | true |
%v | 通用格式 | 任意类型 |
%T | 类型 | int, string |
%p | 指针 | 0xc0000... |
\n | 换行 | - |
实际项目中,代码通常分布在多个文件中。
项目结构:
calc/
├── go.mod
├── main.go
└── calc.go
calc.go:
package main
func Add(a, b int) int {
return a + b
}
main.go:
package main
import "fmt"
func main() {
result := Add(10, 20)
fmt.Printf("10 + 20 = %d\n", result)
}
运行:
go run .
或:
go run main.go calc.go
输出:
10 + 20 = 30
Go 语言有严格的代码规范,使用 go fmt 工具可以自动格式化代码:
go fmt main.go
| 规范 | 说明 |
|---|---|
| 缩进 | 使用 Tab 缩进 |
| 大括号 | 左大括号不能单独一行 |
| 命名 | 驼峰命名法,首字母大写表示公开 |
| 导入 | 未使用的包必须删除 |
// 错误:左大括号单独一行
func main()
{
fmt.Println("Hello")
}
// 正确:左大括号在同一行
func main() {
fmt.Println("Hello")
}
package main
func main() {
fmt.Println("Hello")
}
错误信息:
./main.go:4:2: undefined: fmt
原因:没有导入 fmt 包。
解决方法:
import "fmt"
package main
import "fmt"
import "os"
func main() {
fmt.Println("Hello")
}
错误信息:
./main.go:3:8: imported and not used: "os"
原因:导入了 os 包但没有使用。
解决方法:删除未使用的导入。
package main
import "fmt"
func main()
{
fmt.Println("Hello")
}
错误信息:
./main.go:5:6: syntax error: unexpected semicolon or newline before {
原因:左大括号不能单独一行。
解决方法:将左大括号移到函数声明同一行。
本章我们完成了第一个 Go 程序,学习了:
| 知识点 | 说明 |
|---|---|
package main | 声明可执行程序的包 |
import | 导入其他包 |
func main() | 程序入口函数 |
go run | 编译并运行程序 |
go build | 编译生成可执行文件 |
fmt.Println | 输出字符串并换行 |
go fmt | 格式化代码 |